package me.yobol.algorithm.inaction.netease.greedy;

/*
    ————————问题描述————————
        在N*M的草地上,提莫种了K个蘑菇,
    蘑菇爆炸的威力极大,兰博不想贸然去闯,而且蘑菇是隐形的.只有一种叫做扫描透镜的物品可以扫描出隐形的蘑菇,于是他回了一趟战争学院,
        买了2个扫描透镜,一个扫描透镜可以扫描出(3*3)方格中所有的蘑菇,
    然后兰博就可以清理掉一些隐形的蘑菇. 
        问:兰博最多可以清理多少个蘑菇?
    <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<注意：每个方格被扫描一次只能清除掉一个蘑菇。

    ————————输入描述————————
    第一行三个整数:N,M,K,(1≤N,M≤20,K≤100),N,M代表了草地的大小;
    接下来K行,每行两个整数x,y(1≤x≤N,1≤y≤M).代表(x,y)处提莫种了一个蘑菇.
    <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<一个方格可以种无穷个蘑菇.

    ————————输出描述————————
    输出一行,在这一行输出一个整数,代表兰博最多可以清理多少个蘑菇
*/


import java.util.Scanner;

/**
 *
 * @author Yobol
 */
public class ScanningLens {
    public static int SCOPE = 3;
    
    public static void main(String[] args) {
        int N,M,K;
        try (Scanner input = new Scanner(System.in)) {
            while(input.hasNext()){
                N = input.nextInt();//X
                M = input.nextInt();//Y
                K = input.nextInt();
                int[][] map = new int[N][M];//地图
                //种蘑菇
                for (int i = 0; i < K; i++) {
                    int x = input.nextInt() - 1;
                    int y = input.nextInt() - 1;
                    if (x < N && y < M) {
                        map[y][x]++;
                    }
                }
                
                //拿着规格为3的探测器清理蘑菇
                Area area1 = scan(map, SCOPE);//第1次
                int counter1 = area1.counter;
                clear(map,area1);
                Area area2 = scan(map, SCOPE);
                int counter2 = area2.counter;//第2次
                clear(map,area2);
                System.out.println(counter1 + counter2);
                
            }
        }
    }
    /**
     * 扫描整个地图，找出容纳最多蘑菇的区域
     * 
     * @param map 地图
     * @param scope 扫描仪所能扫描的最大范围
     * @return 本次扫描到容纳最多蘑菇的区域
     */
    public static Area scan(int [][] map,int scope){
        int N = map.length;
        int M = map[0].length;
        Area area = new Area();
        int endX,endY;
        int counter;
        //遍历地图
        for (int startY = 0; startY < M; startY++) {
            for (int startX = 0; startX < N; startX++) {
                endX = startX + scope - 1 >= N ? N - 1 : startX + scope - 1;
                endY = startY + scope - 1 >= M ? M - 1 : startY + scope - 1;
                //计算当前区域内有多少方块内有蘑菇
                if ((counter = count(map, new Area(startX,startY,endX,endY))) > area.counter) {
                    area.counter = counter;
                    area.startX = startX;
                    area.startY = startY;
                    area.endX = endX;
                    area.endY = endY;
                }
            }
        }
        return area;
    }
    
    /**
     * 计算指定区域内有多少方块内有蘑菇
     * 清理蘑菇
     * 
     * @param map
     * @param area
     * @return 
     */
    public static int count(int[][] map,Area area){
        for (int y = area.startY; y <= area.endY; y++) {
            for (int x = area.startX; x <= area.endX; x++) {
                if (map[y][x] > 0) {
                    area.counter++;
                }
            }
        }
        return area.counter;
    }
    
    /**
     * 清除指定区域的蘑菇
     * 
     * @param map
     * @param area 
     */
    public static void clear(int[][] map,Area area){
        for (int y = area.startY; y <= area.endY; y++) {
            for (int x = area.startX; x <= area.endX; x++) {
                if (map[y][x] > 0) {
                    map[y][x]--;
                }
            }
        }
    }
    
    /**
     * 一个扫描目镜所扫描的区域
     */
    public static class Area{
        int startX;//起始坐标X
        int startY;//起始坐标Y
        int endX;//结束坐标X
        int endY;//结束坐标Y
        int counter;//区域内蘑菇的总数
        public Area(){
            this(0, 0, 0, 0);
        }
        public Area(int startX, int startY, int endX, int endY){
            this.startX = startX;
            this.startY = startY;
            this.endX = endX;
            this.endY = endY;
            counter = 0;
        }
    }
}
